/**
 * 封装 axios 请求模块
 */

import axios from 'axios'
import store from '@/store/'
import jsonBig from 'json-bigint'
import { Toast } from 'vant'
import router from '../router/index'

// var json = '{ "value" : 9223372036854775807, "v2": 123 }'

// console.log(JSON.parse(json),'111');
// console.log(jsonBig.parse(json),'000')

const request = axios.create({
  baseURL: process.env.VUE_APP_BASE_URL, // 基地址
  transformResponse: [function (data) { // 解决后端返回数字过大问题
    try {
      // 如果转换成功则返回转换的数据结果
      return jsonBig.parse(data)
    } catch (err) {
      // 如果转换失败，则包装为统一数据格式并返回
      return {
        data
      }
    }
  }]

})

// 请求拦截器
// Add a request interceptor
request.interceptors.request.use(function (config) {
  // Do something before request is sent
  const { user } = store.state
  // 如果用户已登录，统一给接口设置 token 信息
  if (user) {
    config.headers.Authorization = `Bearer ${user.token}`
  }

  // 处理完之后一定要把 config 返回，否则请求就会停在这里
  return config
}, function (error) {
  // Do something with request error
  return Promise.reject(error)
})

// 相应拦截器
request.interceptors.response.use(function (response) {
  // 对响应数据做点什么
  return response
}, async function (error) {
  // 对响应错误做点什么
  const status = error.response.status
  if (status === 400) {
    // 客户端请求参数错误
    Toast.fail('客户端请求参数错误，请重试')
  } else if (status === 401) {
    // token 无效
    const { user } = store.state
    if (!user || !user.refresh_token) {
      redirectLogin()
      return // 代码不要往后执行了
    }
    // // 如果有refresh_token，则请求获取新的 token
    try {
      const res = await axios({
        method: 'PUT',
        url: 'http://ttapi.research.itcast.cn/app/v1_0/authorizations',
        headers: {
          Authorization: `Bearer ${user.refresh_token}`
        }
      })

      // 如果获取成功，则把新的 token 更新到容器中
      user.token = res.data.data.token
      store.commit('setUser', user)

      // 把之前失败的用户请求继续发出去
      // config 是一个对象，其中包含本次失败请求相关的那些配置信息，例如 url、method 都有
      // return 把 request 的请求结果继续返回给发请求的具体位置
      return request(error.config)
    } catch (err) {
      // 如果获取失败，直接跳转 登录页
      console.log('请求刷线 token 失败', err)
      redirectLogin()// 跳转到登录页
    }
  } else if (status === 403) {
    // 没有权限
    Toast.fail('没有权限，请重试')
  } else if (status >= 500) {
    // 服务端异常
    Toast.fail('服务端异常，请重试')
  }
  return Promise.reject(error)
})

function redirectLogin () {
  // router.currentRoute 当前路由对象，和你在组件中访问的 this.$route 是同一个东西
  // query 参数的数据格式就是：?key=value&key=value
  router.push({
    path: '/login',
    redirect: router.currentRoute.fullPath
  })
}
// 导出
export default request
